/* Araujo Heiker CI. 19726991
 * Goyo Willandher CI.20666542
 * Rodriguez Rafael CI.20009872
 * Williams Roman CI.20016812 
 * Morett Gilberth CI.20929667*/

package controlador;

import modelo.*;
import vista.PantallaIncluirDepositos;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class ControladorPantallaIncluirDeposito implements ActionListener {
		
		private PantallaIncluirDepositos pantallaIncluirDepositos;
		private Drogueria drogueria;
		String codigoDeposito;
		String imec;

		
		public ControladorPantallaIncluirDeposito (Drogueria drogueria, String imec, String codigo) {
			
			pantallaIncluirDepositos = new PantallaIncluirDepositos();
			pantallaIncluirDepositos.agregarListener(this);
			pantallaIncluirDepositos.setLocationRelativeTo(null);
			pantallaIncluirDepositos.setVisible(true);
			this.drogueria=drogueria;
			this.codigoDeposito=codigo;
			this.imec=imec;
			this.generarCodigoDeposito();
			this.inicializarVentana();
		}
		
		@Override
		public void actionPerformed(ActionEvent e) {
			if (e.getActionCommand().equalsIgnoreCase("Guardar")){ 
				agregarDeposito();
				actualizarListaDepositos();
			}	
			else if (e.getActionCommand().equalsIgnoreCase("Aceptar")){
				aceptarCambios();
				actualizarListaDepositos();
			}
			else cancelar();
		}
		
		public void generarCodigoDeposito() {
			
			int e = drogueria.cantidadDepositos()+0+1;
			if (e<10){
				String codigo = "D-"+0+e;
				pantallaIncluirDepositos.setCodigoDeposito(codigo);
			}
			else{
				String codigo = "D-"+e;
				pantallaIncluirDepositos.setCodigoDeposito(codigo);
			}
		}
		//Este metodo permite controlar especificamente por cual opcion se esta instanciando el controlador de la pantalla incluir deposito,
		//dependiendo del string recibido; es decir si es modificar, o incluir
		public void inicializarVentana() {

			if (imec.equals("Modificar")) {
				pantallaIncluirDepositos.desaparecerBoton(0);
				pegarDeposito();
			}else if(imec.equals("Incluir")){
				pantallaIncluirDepositos.desaparecerBoton(1);
			}
		}
		
		private void agregarDeposito() {
			
			try {
				String codigo = pantallaIncluirDepositos.getTxtCodigoDeposito();
				String nombre = pantallaIncluirDepositos.getTxtNombre();
				int nroPaletas = Integer.parseInt(pantallaIncluirDepositos.getTxtCantPaletas());
				int nroEstantes = Integer.parseInt(pantallaIncluirDepositos.getTxtCantEstantes());
				Deposito deposito = new Deposito();
				deposito.setCodigo(codigo);
				deposito.setNombre(nombre);
				deposito.setStatus('A');
				if (nroPaletas>0){
				
					for (int i=0; i<nroPaletas; i++) {
						int e = i+1;
						if (i < 9) {
						String nroPaleta = "PL-0"+e;
						String descripcion = "Paleta de Madera";
						Paleta paleta = new Paleta(nroPaleta, descripcion);
						deposito.incluirPaleta(paleta);
						}
						else {
							String nroPaleta = "PL-"+e;
							String descripcion = "Paleta de Madera";
							Paleta paleta = new Paleta(nroPaleta, descripcion);
							deposito.incluirPaleta(paleta);
						}
					}
				}
				
				if (nroEstantes > 0) {
					for (int i=0; i<nroEstantes; i++){
						int e = i+1;
						if (i<9){
						String nroEstante = "ET-0"+e;
						String descripcion = "Estante de Metal";
						Estante estantes = new Estante();
						estantes.setNroEstante(nroEstante);
						estantes.setDescripcion(descripcion);
						deposito.incluirEstante(estantes);
						}
						else {
							String nroEstante = "ET-"+e;
							String descripcion = "Estante de Metal";
							Estante estantes = new Estante();
							estantes.setNroEstante(nroEstante);
							estantes.setDescripcion(descripcion);
							deposito.incluirEstante(estantes);

						}
						}
				}
				drogueria.incluirDeposito(deposito);
				pantallaIncluirDepositos.mostrarMensaje("Se ha incluido un Depósito con Código: "+deposito.getCodigo()+ " Hay: " + drogueria.cantidadDepositos()+" Depósitos");
				pantallaIncluirDepositos.mostrarMensaje("Hay "+deposito.cantPaletas()+" Paletas y "+deposito.cantEstantes()+ " Estantes en el Deposito");
				pantallaIncluirDepositos.Limpiar();
				
			}
			catch(NumberFormatException e) {
				pantallaIncluirDepositos.mostrarMensaje("La Cantidad de Depósitos/Estantes debe ser un número Entero");
			}
			catch(Exception e) {
				pantallaIncluirDepositos.mostrarMensaje(e.toString());
			}
		}
		
		//Metodo que permite pegar los campos de un deposito que ha sido seleccionado por el cliente de la tabla para ser modificado
		
		public void pegarDeposito() {
			
				int indice = drogueria.buscarDeposito(codigoDeposito);
				Deposito deposito = drogueria.getUnDeposito(indice);
				String codigo = deposito.getCodigo();
				String nombre = deposito.getNombre();
				String cantEstantes = String.valueOf(deposito.cantEstantes());
				String cantPaletas = String.valueOf(deposito.cantPaletas());
				
				pantallaIncluirDepositos.setCodigoDeposito(codigo);
				pantallaIncluirDepositos.setNombreDeposito(nombre);
				pantallaIncluirDepositos.setCantEstantes(cantEstantes);
				pantallaIncluirDepositos.setCantPaletas(cantPaletas);			
			
		}
		//Metodo que permite guardar los campos y modificaciones hechas sobre determinado registro de un deposito
		
		public void aceptarCambios(){
			
			try {
				int indice = drogueria.buscarDeposito(codigoDeposito);
				Deposito deposito = drogueria.getUnDeposito(indice);
				String codigo = pantallaIncluirDepositos.getTxtCodigoDeposito();
				String nombre = pantallaIncluirDepositos.getTxtNombre();
				int nroPaletas = Integer.parseInt(pantallaIncluirDepositos.getTxtCantPaletas());
				int nroEstantes = Integer.parseInt(pantallaIncluirDepositos.getTxtCantEstantes());
				int cantActualPaletas = deposito.cantPaletas();
				int cantActualEstantes = deposito.cantEstantes();
				deposito.setCodigo(codigo);
				deposito.setNombre(nombre);
				
				if ( nroPaletas > cantActualPaletas){
					int incremento = deposito.sumarCantidadPaletasEstantes(cantActualPaletas, nroPaletas);
					for (int i = 0; i<incremento; i++){
						int sumaPaletas = deposito.cantPaletas()+1;
						String nroPaleta = "PL-"+sumaPaletas;
						String descripcion = "Paleta de Madera";
						Paleta paleta = new Paleta(nroPaleta, descripcion);
						deposito.incluirPaleta(paleta);
					}
				}
				
				if ( nroEstantes > cantActualEstantes){
					int incremento = deposito.sumarCantidadPaletasEstantes(cantActualEstantes, nroEstantes);
					for (int i = 0; i<incremento; i++){
						int sumaEstantes = deposito.cantEstantes()+1;
						String nroPaleta = "ET-"+sumaEstantes;
						String descripcion = "Estante de Metal";
						Estante estante = new Estante(nroPaleta, descripcion);
						deposito.incluirEstante(estante);
					}
				}
				
				drogueria.setUnDeposito(indice, deposito);
				pantallaIncluirDepositos.mostrarMensaje("Cambios Guardados Satisfactoriamente");
				pantallaIncluirDepositos.Limpiar();
				
			}
			catch(NumberFormatException e) {
				pantallaIncluirDepositos.mostrarMensaje("La Cantidad de Depósitos/Estantes debe ser un número Entero");
			}
			catch(Exception e) {
				pantallaIncluirDepositos.mostrarMensaje(e.toString());
			}
		}
		//Cierra la pantalla de inclusion de un deposito y limpia sus campos
		private void cancelar(){
			pantallaIncluirDepositos.Limpiar();
			pantallaIncluirDepositos.dispose();
		}
		
		public void actualizarListaDepositos(){
			
				pantallaIncluirDepositos.dispose();
				new ControladorPantallaDeposito(drogueria);
		}

}